টাইপস্ক্রিপ্ট ব্যবহার করে এলএলএম ও এনএলপি-ভিত্তিক শক্তিশালী, টাইপ-সেফ অ্যাপ্লিকেশন তৈরির নির্দেশিকা। রানটাইম ত্রুটি এড়াতে এবং কাঠামোগত আউটপুট আয়ত্ত করতে শিখুন।
টাইপস্ক্রিপ্ট দিয়ে এলএলএম ব্যবহার: টাইপ-সেফ এনএলপি ইন্টিগ্রেশনের চূড়ান্ত নির্দেশিকা
বৃহৎ ভাষা মডেল (এলএলএম) এর যুগ আমাদের দ্বারপ্রান্তে। ওপেনএআই, গুগল, অ্যান্থ্রপিক-এর মতো প্রদানকারী এবং ওপেন-সোর্স মডেলগুলির এপিআইগুলি দ্রুত গতিতে অ্যাপ্লিকেশনগুলিতে সংহত হচ্ছে। বুদ্ধিমান চ্যাটবট থেকে শুরু করে জটিল ডেটা বিশ্লেষণ সরঞ্জাম পর্যন্ত, এলএলএমগুলি সফটওয়্যারে যা সম্ভব, তা পরিবর্তন করছে। তবে, এই নতুন দিগন্ত ডেভেলপারদের জন্য একটি গুরুত্বপূর্ণ চ্যালেঞ্জ নিয়ে আসে: অ্যাপ্লিকেশন কোডের সুনির্দিষ্ট জগতে এলএলএম আউটপুটগুলির অপ্রত্যাশিত, সম্ভাবনাময় প্রকৃতি পরিচালনা করা।
যখন আপনি একটি এলএলএমকে টেক্সট তৈরি করতে বলেন, তখন আপনি এমন একটি মডেলের সাথে কাজ করছেন যা কঠোর যুক্তি নয়, বরং পরিসংখ্যানগত প্যাটার্নের উপর ভিত্তি করে বিষয়বস্তু তৈরি করে। যদিও আপনি এটিকে JSON-এর মতো একটি নির্দিষ্ট বিন্যাসে ডেটা ফিরিয়ে দিতে উৎসাহিত করতে পারেন, তবে এটি প্রতিবার পুরোপুরি মেনে চলবে এমন কোনো নিশ্চয়তা নেই। এই পরিবর্তনশীলতা রানটাইম ত্রুটি, অপ্রত্যাশিত অ্যাপ্লিকেশন আচরণ এবং রক্ষণাবেক্ষণের দুঃস্বপ্নের একটি প্রধান উৎস। এখানেই টাইপস্ক্রিপ্ট, জাভাস্ক্রিপ্টের একটি স্ট্যাটিক্যালি টাইপ করা সুপারসেট, কেবল একটি সহায়ক টুল নয়, বরং উৎপাদন-গ্রেডের এআই-চালিত অ্যাপ্লিকেশন তৈরির জন্য একটি অপরিহার্য উপাদান হয়ে ওঠে।
এই ব্যাপক নির্দেশিকাটি আপনার এলএলএম এবং এনএলপি ইন্টিগ্রেশনগুলিতে টাইপ সেফটি প্রয়োগ করতে টাইপস্ক্রিপ্ট ব্যবহারের কারণ এবং পদ্ধতি সম্পর্কে আপনাকে ধাপে ধাপে অবহিত করবে। আমরা মৌলিক ধারণা, বাস্তব বাস্তবায়ন প্যাটার্ন এবং উন্নত কৌশলগুলি অন্বেষণ করব যা আপনাকে এমন অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে যা এআই-এর সহজাত অনিশ্চয়তার মুখেও শক্তিশালী, রক্ষণাবেক্ষণযোগ্য এবং স্থিতিস্থাপক।
এলএলএম-এর জন্য টাইপস্ক্রিপ্ট কেন? টাইপ সেফটির অপরিহার্যতা
ঐতিহ্যবাহী এপিআই ইন্টিগ্রেশনে, আপনার প্রায়শই একটি কঠোর চুক্তি থাকে — একটি ওপেনএপিআই স্পেসিফিকেশন বা একটি গ্রাফকিউএল স্কিমা — যা আপনি যে ডেটা পাবেন তার সঠিক আকার সংজ্ঞায়িত করে। এলএলএম এপিআইগুলি আলাদা। আপনার "চুক্তি" হলো প্রাকৃতিক ভাষার প্রম্পট যা আপনি পাঠান, এবং মডেল দ্বারা এর ব্যাখ্যা ভিন্ন হতে পারে। এই মৌলিক পার্থক্য টাইপ সেফটিকে অত্যন্ত গুরুত্বপূর্ণ করে তোলে।
এলএলএম আউটপুটগুলির অপ্রত্যাশিত প্রকৃতি
কল্পনা করুন আপনি একটি এলএলএমকে একটি টেক্সট ব্লক থেকে ব্যবহারকারীর বিবরণ নিষ্কাশন করতে এবং একটি JSON অবজেক্ট ফেরত দিতে উৎসাহিত করেছেন। আপনি এমন কিছু আশা করছেন:
{ "name": "John Doe", "email": "john.doe@example.com", "userId": 12345 }
তবে, মডেলের বিভ্রম, প্রম্পটের ভুল ব্যাখ্যা, বা এর প্রশিক্ষণে সামান্য ভিন্নতার কারণে আপনি পেতে পারেন:
- একটি অনুপস্থিত ফিল্ড:
{ "name": "John Doe", "email": "john.doe@example.com" } - ভুল টাইপের একটি ফিল্ড:
{ "name": "John Doe", "email": "john.doe@example.com", "userId": "12345-A" } - অতিরিক্ত, অপ্রত্যাশিত ফিল্ড:
{ "name": "John Doe", "email": "john.doe@example.com", "userId": 12345, "notes": "User seems friendly." } - একটি সম্পূর্ণ ত্রুটিপূর্ণ স্ট্রিং যা এমনকি বৈধ JSON ও নয়।
ভ্যানিলা জাভাস্ক্রিপ্টে, আপনার কোড response.userId.toString() অ্যাক্সেস করার চেষ্টা করতে পারে, যার ফলে একটি TypeError: Cannot read properties of undefined হয় যা আপনার অ্যাপ্লিকেশনকে ক্র্যাশ করে বা আপনার ডেটা নষ্ট করে।
এলএলএম প্রসঙ্গে টাইপস্ক্রিপ্টের মূল সুবিধা
টাইপস্ক্রিপ্ট একটি শক্তিশালী টাইপ সিস্টেম সরবরাহ করে এই চ্যালেঞ্জগুলি সরাসরি মোকাবেলা করে যা বেশ কয়েকটি মূল সুবিধা প্রদান করে:
- কম্পাইল-টাইম ত্রুটি পরীক্ষা: টাইপস্ক্রিপ্টের স্ট্যাটিক বিশ্লেষণ ডেভেলপমেন্টের সময় সম্ভাব্য টাইপ-সম্পর্কিত ত্রুটিগুলি ধরে ফেলে, আপনার কোড প্রোডাকশনে পৌঁছানোর অনেক আগেই। এই প্রাথমিক ফিডব্যাক লুপটি অমূল্য যখন ডেটা উৎস সহজাতভাবে অবিশ্বস্ত হয়।
- বুদ্ধিমান কোড সম্পন্নকরণ (IntelliSense): যখন আপনি একটি এলএলএম-এর আউটপুটের প্রত্যাশিত আকার সংজ্ঞায়িত করেছেন, আপনার আইডিই সঠিক স্বয়ংসম্পন্নকরণ প্রদান করতে পারে, টাইপিং ত্রুটি কমিয়ে ডেভেলপমেন্টকে দ্রুত এবং আরও নির্ভুল করে তোলে।
- সেল্ফ-ডকুমেন্টিং কোড: টাইপ ডেফিনিশনগুলি পরিষ্কার, মেশিন-পঠনযোগ্য ডকুমেন্টেশন হিসাবে কাজ করে। একজন ডেভেলপার
function processUserData(data: UserProfile): Promise<void>-এর মতো একটি ফাংশন স্বাক্ষর দেখে বিস্তারিত মন্তব্য পড়ার প্রয়োজন ছাড়াই ডেটা চুক্তিটি তাৎক্ষণিকভাবে বুঝতে পারেন। - নিরাপদ রিফ্যাক্টরিং: আপনার অ্যাপ্লিকেশন বিকশিত হওয়ার সাথে সাথে, আপনাকে অনিবার্যভাবে এলএলএম থেকে প্রত্যাশিত ডেটা স্ট্রাকচারগুলি পরিবর্তন করতে হবে। টাইপস্ক্রিপ্টের কম্পাইলার আপনাকে গাইড করবে, আপনার কোডবেসের প্রতিটি অংশ হাইলাইট করবে যা নতুন কাঠামোকে মানিয়ে নিতে আপডেট করা প্রয়োজন, যা রিগ্রেশন প্রতিরোধ করবে।
মৌলিক ধারণা: এলএলএম ইনপুট এবং আউটপুট টাইপিং
টাইপ সেফটির যাত্রা শুরু হয় এলএলএম-এ পাঠানো ডেটা (প্রম্পট) এবং প্রাপ্ত প্রত্যাশিত ডেটা (প্রতিক্রিয়া) উভয়ের জন্য স্পষ্ট চুক্তি সংজ্ঞায়িত করার মাধ্যমে।
প্রম্পট টাইপিং
যদিও একটি সাধারণ প্রম্পট একটি স্ট্রিং হতে পারে, জটিল ইন্টারঅ্যাকশনগুলির জন্য প্রায়শই আরও কাঠামোগত ইনপুট জড়িত থাকে। উদাহরণস্বরূপ, একটি চ্যাট অ্যাপ্লিকেশনে, আপনি বার্তাগুলির একটি ইতিহাস পরিচালনা করবেন, যার প্রত্যেকটির একটি নির্দিষ্ট ভূমিকা থাকবে। আপনি টাইপস্ক্রিপ্ট ইন্টারফেসের মাধ্যমে এটি মডেল করতে পারেন:
interface ChatMessage {
role: 'system' | 'user' | 'assistant';
content: string;
}
interface ChatPrompt {
model: string;
messages: ChatMessage[];
temperature?: number;
max_tokens?: number;
}
এই পদ্ধতি নিশ্চিত করে যে আপনি সর্বদা একটি বৈধ ভূমিকা সহ বার্তা প্রদান করেন এবং সামগ্রিক প্রম্পট কাঠামো সঠিক থাকে। role প্রপার্টির জন্য 'system' | 'user' | 'assistant' এর মতো একটি ইউনিয়ন টাইপ ব্যবহার করা 'systen' এর মতো সাধারণ টাইপিং ত্রুটিগুলিকে রানটাইম ত্রুটি ঘটানো থেকে প্রতিরোধ করে।
এলএলএম প্রতিক্রিয়ার টাইপিং: মূল চ্যালেঞ্জ
প্রতিক্রিয়া টাইপ করা আরও চ্যালেঞ্জিং কিন্তু আরও গুরুত্বপূর্ণ। প্রথম ধাপ হল এলএলএমকে একটি কাঠামোগত প্রতিক্রিয়া প্রদান করতে রাজি করানো, সাধারণত JSON এর জন্য জিজ্ঞাসা করে। আপনার প্রম্পট ইঞ্জিনিয়ারিং এখানে মূল বিষয়।
উদাহরণস্বরূপ, আপনি আপনার প্রম্পটটি এই ধরনের একটি নির্দেশ দিয়ে শেষ করতে পারেন:
"নিম্নলিখিত গ্রাহক প্রতিক্রিয়ার অনুভূতি বিশ্লেষণ করুন। শুধুমাত্র একটি JSON অবজেক্টের নিম্নলিখিত বিন্যাসে প্রতিক্রিয়া জানান: { \"sentiment\": \"Positive\", \"keywords\": [\"word1\", \"word2\"] }। অনুভূতির সম্ভাব্য মানগুলি হলো 'Positive', 'Negative', অথবা 'Neutral'।"
এই নির্দেশনার মাধ্যমে, আপনি এখন এই প্রত্যাশিত কাঠামোকে উপস্থাপন করার জন্য একটি সংশ্লিষ্ট টাইপস্ক্রিপ্ট ইন্টারফেস সংজ্ঞায়িত করতে পারেন:
type Sentiment = 'Positive' | 'Negative' | 'Neutral';
interface SentimentAnalysisResponse {
sentiment: Sentiment;
keywords: string[];
}
এখন, আপনার কোডের যেকোনো ফাংশন যা এলএলএম-এর আউটপুট প্রক্রিয়া করে, সেটি SentimentAnalysisResponse অবজেক্ট আশা করার জন্য টাইপ করা যেতে পারে। এটি আপনার অ্যাপ্লিকেশনের মধ্যে একটি স্পষ্ট চুক্তি তৈরি করে, কিন্তু এটি পুরো সমস্যাটির সমাধান করে না। এলএলএম-এর আউটপুট এখনও কেবল একটি স্ট্রিং যা আপনি আশা করেন আপনার ইন্টারফেসের সাথে মিলে যাওয়া একটি বৈধ JSON। রানটাইমে এটি যাচাই করার একটি উপায় আমাদের প্রয়োজন।
ব্যবহারিক বাস্তবায়ন: জড সহ একটি ধাপে ধাপে নির্দেশিকা
টাইপস্ক্রিপ্ট থেকে স্ট্যাটিক টাইপগুলি ডেভেলপমেন্টের সময়ের জন্য। ব্যবধান দূর করতে এবং রানটাইমে প্রাপ্ত ডেটা আপনার টাইপের সাথে মিলে যায় তা নিশ্চিত করতে, আমাদের একটি রানটাইম বৈধতা লাইব্রেরি প্রয়োজন। জড হল একটি অবিশ্বাস্যভাবে জনপ্রিয় এবং শক্তিশালী টাইপস্ক্রিপ্ট-প্রথম স্কিমা ঘোষণা এবং বৈধতা লাইব্রেরি যা এই কাজের জন্য পুরোপুরি উপযুক্ত।
চলুন একটি ব্যবহারিক উদাহরণ তৈরি করি: একটি সিস্টেম যা একটি অসংগঠিত চাকরির আবেদন ইমেল থেকে কাঠামোগত ডেটা নিষ্কাশন করে।
ধাপ ১: প্রকল্প সেট আপ করা
একটি নতুন Node.js প্রকল্প শুরু করুন এবং প্রয়োজনীয় নির্ভরতাগুলি ইনস্টল করুন:
npm init -y
npm install typescript ts-node zod openai
npx tsc --init
আপনার tsconfig.json সঠিকভাবে কনফিগার করা আছে তা নিশ্চিত করুন (যেমন, \"module\": \"NodeNext\" এবং \"moduleResolution\": \"NodeNext\" সেট করা)।
ধাপ ২: একটি জড স্কিমা দিয়ে ডেটা চুক্তি সংজ্ঞায়িত করা
শুধু একটি টাইপস্ক্রিপ্ট ইন্টারফেস সংজ্ঞায়িত করার পরিবর্তে, আমরা একটি জড স্কিমা সংজ্ঞায়িত করব। জড আমাদের সরাসরি স্কিমা থেকে টাইপস্ক্রিপ্ট টাইপ অনুমান করতে দেয়, যা আমাদের রানটাইম বৈধতা এবং স্ট্যাটিক টাইপ উভয়ই একটি একক উৎসের সত্য থেকে দেয়।
import { z } from 'zod';
// Define the schema for the extracted applicant data
const ApplicantSchema = z.object({
fullName: z.string().describe("The full name of the applicant"),
email: z.string().email("A valid email address for the applicant"),
yearsOfExperience: z.number().min(0).describe("The total years of professional experience"),
skills: z.array(z.string()).describe("A list of key skills mentioned"),
suitabilityScore: z.number().min(1).max(10).describe("A score from 1 to 10 indicating suitability for the role"),
});
// Infer the TypeScript type from the schema
type Applicant = z.infer<typeof ApplicantSchema>;
// Now we have both a validator (ApplicantSchema) and a static type (Applicant)!
ধাপ ৩: একটি টাইপ-সেফ এলএলএম এপিআই ক্লায়েন্ট তৈরি করা
এখন, চলুন একটি ফাংশন তৈরি করি যা কাঁচা ইমেল টেক্সট নেয়, এটিকে একটি এলএলএম-এ পাঠায় এবং আমাদের জড স্কিমার বিরুদ্ধে প্রতিক্রিয়াটি পার্স ও যাচাই করার চেষ্টা করে।
import { OpenAI } from 'openai';
import { z } from 'zod';
import { ApplicantSchema } from './schemas'; // Assuming schema is in a separate file
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
// A custom error class for when LLM output validation fails
class LLMValidationError extends Error {
constructor(message: string, public rawOutput: string) {
super(message);
this.name = 'LLMValidationError';
}
}
async function extractApplicantData(emailBody: string): Promise<Applicant> {
const prompt = `
Please extract the following information from the job application email below.
Respond with ONLY a valid JSON object that conforms to this schema:
{
\"fullName\": \"string\",
\"email\": \"string (valid email format)\",
\"yearsOfExperience\": \"number\",
\"skills\": [\"string\"],
\"suitabilityScore\": \"number (integer from 1 to 10)\"
}
Email Content:
---
${emailBody}
---
`;
const response = await openai.chat.completions.create({
model: 'gpt-4-turbo-preview',
messages: [{ role: 'user', content: prompt }],
response_format: { type: 'json_object' }, // Use model's JSON mode if available
});
const rawOutput = response.choices[0].message.content;
if (!rawOutput) {
throw new Error('Received an empty response from the LLM.');
}
try {
const jsonData = JSON.parse(rawOutput);
// This is the crucial runtime validation step!
const validatedData = ApplicantSchema.parse(jsonData);
return validatedData;
} catch (error) {
if (error instanceof z.ZodError) {
console.error('Zod validation failed:', error.errors);
// Throw a custom error with more context
throw new LLMValidationError('LLM output did not match the expected schema.', rawOutput);
} else if (error instanceof SyntaxError) {
// JSON.parse failed
throw new LLMValidationError('LLM output was not valid JSON.', rawOutput);
} else {
throw error; // Re-throw other unexpected errors
}
}
}
এই ফাংশনে, ApplicantSchema.parse(jsonData) লাইনটি অপ্রত্যাশিত রানটাইম জগৎ এবং আমাদের টাইপ-সেফ অ্যাপ্লিকেশন কোডের মধ্যে একটি সেতু। যদি ডেটার আকার বা টাইপ ভুল হয়, জড একটি বিস্তারিত ত্রুটি দেবে, যা আমরা ক্যাচ করি। যদি এটি সফল হয়, আমরা 100% নিশ্চিত হতে পারি যে validatedData অবজেক্টটি আমাদের Applicant টাইপের সাথে পুরোপুরি মিলে যায়। এই মুহূর্ত থেকে, আমাদের অ্যাপ্লিকেশনের বাকি অংশ সম্পূর্ণ টাইপ সেফটি এবং আত্মবিশ্বাসের সাথে এই ডেটা ব্যবহার করতে পারে।
চূড়ান্ত দৃঢ়তার জন্য উন্নত কৌশল
বৈধকরণ ব্যর্থতা এবং পুনরায় চেষ্টা করা পরিচালনা করা
যখন LLMValidationError থ্রো করা হয় তখন কী হয়? কেবল ক্র্যাশ করা একটি দৃঢ় সমাধান নয়। এখানে কিছু কৌশল রয়েছে:
- লগিং: সর্বদা `rawOutput` লগ করুন যা বৈধকরণে ব্যর্থ হয়েছে। এই ডেটা আপনার প্রম্পটগুলি ডিবাগ করতে এবং কেন এলএলএম মেনে চলতে ব্যর্থ হচ্ছে তা বোঝার জন্য অমূল্য।
- স্বয়ংক্রিয় পুনরায় চেষ্টা: একটি পুনরায় চেষ্টা করার প্রক্রিয়া বাস্তবায়ন করুন। `catch` ব্লকে, আপনি এলএলএম-কে দ্বিতীয়বার কল করতে পারেন। এইবার, আসল ত্রুটিপূর্ণ আউটপুট এবং জড ত্রুটির বার্তাগুলি প্রম্পটে অন্তর্ভুক্ত করুন, মডেলকে তার পূর্ববর্তী প্রতিক্রিয়া সংশোধন করতে বলুন।
- ফলব্যাক লজিক: অ-গুরুত্বপূর্ণ অ্যাপ্লিকেশনগুলির জন্য, আপনি কয়েকটি পুনরায় চেষ্টার পরে বৈধকরণ ব্যর্থ হলে একটি ডিফল্ট অবস্থা বা ম্যানুয়াল রিভিউ কিউতে ফিরে যেতে পারেন।
// Simplified retry logic example
async function extractWithRetry(emailBody: string, maxRetries = 2): Promise<Applicant> {
let attempts = 0;
let lastError: Error | null = null;
while (attempts < maxRetries) {
try {
return await extractApplicantData(emailBody);
} catch (error) {
attempts++;
lastError = error as Error;
console.log(`Attempt ${attempts} failed. Retrying...`);
}
}
throw new Error(`Failed to extract data after ${maxRetries} attempts. Last error: ${lastError?.message}`);
}
পুনরায় ব্যবহারযোগ্য, টাইপ-সেফ এলএলএম ফাংশনগুলির জন্য জেনেরিক
আপনি দ্রুতই নিজেকে বিভিন্ন ডেটা কাঠামোর জন্য একই ধরনের নিষ্কাশন লজিক লিখতে দেখবেন। এটি টাইপস্ক্রিপ্ট জেনেরিক্সের জন্য একটি নিখুঁত ব্যবহারের ক্ষেত্র। আমরা একটি উচ্চ-ক্রম ফাংশন তৈরি করতে পারি যা যেকোনো জড স্কিমার জন্য একটি টাইপ-সেফ পার্সার তৈরি করে।
async function createStructuredOutput<T extends z.ZodType>(
content: string,
schema: T,
promptInstructions: string
): Promise<z.infer<T>> {
const prompt = `${promptInstructions}\n\nContent to analyze:\n---\n${content}\n---\n`;
// ... (OpenAI API call logic as before)
const rawOutput = response.choices[0].message.content;
// ... (Parsing and validation logic as before, but using the generic schema)
const jsonData = JSON.parse(rawOutput!);
const validatedData = schema.parse(jsonData);
return validatedData;
}
// Usage:
const emailBody = "...";
const promptForApplicant = "Extract applicant data and respond with JSON...";
const applicantData = await createStructuredOutput(emailBody, ApplicantSchema, promptForApplicant);
// applicantData is fully typed as 'Applicant'
এই জেনেরিক ফাংশনটি এলএলএম কল করা, পার্স করা এবং যাচাই করার মূল লজিককে আবদ্ধ করে, যা আপনার কোডকে নাটকীয়ভাবে আরও মডুলার, পুনরায় ব্যবহারযোগ্য এবং টাইপ-সেফ করে তোলে।
JSON এর বাইরে: টাইপ-সেফ টুল ব্যবহার এবং ফাংশন কলিং
আধুনিক এলএলএমগুলি সাধারণ টেক্সট জেনারেশনের বাইরে গিয়ে এমন রিজনিং ইঞ্জিন হয়ে উঠছে যা বাহ্যিক টুল ব্যবহার করতে পারে। OpenAI-এর "ফাংশন কলিং" বা Anthropic-এর "টুল ইউজ"-এর মতো বৈশিষ্ট্যগুলি আপনাকে আপনার অ্যাপ্লিকেশনের ফাংশনগুলিকে এলএলএম-এর কাছে বর্ণনা করার অনুমতি দেয়। এলএলএম তখন ফাংশনের নাম এবং তাতে পাস করার আর্গুমেন্টগুলি ধারণ করে একটি JSON অবজেক্ট তৈরি করে এই ফাংশনগুলির মধ্যে একটিকে "কল" করতে বেছে নিতে পারে।
টাইপস্ক্রিপ্ট এবং জড এই দৃষ্টান্তের জন্য অসাধারণভাবে উপযুক্ত।
টুল ডেফিনিশন এবং এক্সিকিউশন টাইপিং
কল্পনা করুন আপনার কাছে একটি ই-কমার্স চ্যাটবটের জন্য কিছু টুল রয়েছে:
checkInventory(productId: string)getOrderStatus(orderId: string)
আপনি তাদের আর্গুমেন্টের জন্য জড স্কিমা ব্যবহার করে এই টুলগুলি সংজ্ঞায়িত করতে পারেন:
const checkInventoryParams = z.object({ productId: z.string() });
const getOrderStatusParams = z.object({ orderId: z.string() });
const toolSchemas = {
checkInventory: checkInventoryParams,
getOrderStatus: getOrderStatusParams,
};
// We can create a discriminated union for all possible tool calls
const ToolCallSchema = z.discriminatedUnion('toolName', [
z.object({ toolName: z.literal('checkInventory'), args: checkInventoryParams }),
z.object({ toolName: z.literal('getOrderStatus'), args: getOrderStatusParams }),
]);
type ToolCall = z.infer<typeof ToolCallSchema>;
যখন এলএলএম একটি টুল কল অনুরোধের সাথে সাড়া দেয়, আপনি এটি `ToolCallSchema` ব্যবহার করে পার্স করতে পারেন। এটি নিশ্চিত করে যে `toolName` আপনি সমর্থন করেন এবং `args` অবজেক্টের সেই নির্দিষ্ট টুলের জন্য সঠিক আকার রয়েছে। এটি আপনার অ্যাপ্লিকেশনকে অস্তিত্বহীন ফাংশনগুলি চালানোর চেষ্টা করা বা অবৈধ আর্গুমেন্ট সহ বিদ্যমান ফাংশনগুলিকে কল করা থেকে প্রতিরোধ করে।
আপনার টুল এক্সিকিউশন লজিক তখন একটি টাইপ-সেফ সুইচ স্টেটমেন্ট বা একটি ম্যাপ ব্যবহার করে কলটিকে সঠিক টাইপস্ক্রিপ্ট ফাংশনে প্রেরণ করতে পারে, এই আত্মবিশ্বাসের সাথে যে আর্গুমেন্টগুলি বৈধ।
বৈশ্বিক প্রেক্ষাপট এবং সেরা অনুশীলন
একটি বৈশ্বিক শ্রোতাদের জন্য এলএলএম-চালিত অ্যাপ্লিকেশন তৈরি করার সময়, টাইপ সেফটি অতিরিক্ত সুবিধা প্রদান করে:
- স্থানীয়করণ পরিচালনা: যদিও একটি এলএলএম অনেক ভাষায় টেক্সট তৈরি করতে পারে, তবে আপনি যে কাঠামোগত ডেটা নিষ্কাশন করেন তা সামঞ্জস্যপূর্ণ থাকা উচিত। টাইপ সেফটি নিশ্চিত করে যে একটি ডেট ফিল্ড সর্বদা একটি বৈধ ISO স্ট্রিং, একটি মুদ্রা সর্বদা একটি সংখ্যা, এবং একটি পূর্বনির্ধারিত বিভাগ সর্বদা অনুমোদিত এনাম মানগুলির মধ্যে একটি, উৎস ভাষা নির্বিশেষে।
- এপিআই বিবর্তন: এলএলএম প্রদানকারীরা প্রায়শই তাদের মডেল এবং এপিআই আপডেট করে। একটি শক্তিশালী টাইপ সিস্টেম এই পরিবর্তনগুলির সাথে মানিয়ে নেওয়াকে উল্লেখযোগ্যভাবে সহজ করে তোলে। যখন একটি ফিল্ড বাতিল করা হয় বা একটি নতুন যোগ করা হয়, টাইপস্ক্রিপ্ট কম্পাইলার অবিলম্বে আপনার কোডের প্রতিটি স্থান দেখাবে যা আপডেট করা প্রয়োজন।
- অডিটিং এবং কমপ্লায়েন্স: সংবেদনশীল ডেটা নিয়ে কাজ করা অ্যাপ্লিকেশনগুলির জন্য, এলএলএম আউটপুটগুলিকে একটি কঠোর, বৈধ স্কিমাতে জোর করা অডিটিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ। এটি নিশ্চিত করে যে মডেলটি অপ্রত্যাশিত বা অ-সম্মত তথ্য ফেরত দিচ্ছে না, যা পক্ষপাত বা নিরাপত্তা দুর্বলতার জন্য বিশ্লেষণ করা সহজ করে তোলে।
উপসংহার: আত্মবিশ্বাসের সাথে এআই-এর ভবিষ্যত নির্মাণ
অ্যাপ্লিকেশনগুলিতে বৃহৎ ভাষা মডেলগুলিকে একীভূত করা সম্ভাবনার একটি জগত উন্মুক্ত করে, তবে এটি মডেলগুলির সম্ভাবনাময় প্রকৃতির মধ্যে নিহিত নতুন শ্রেণীর চ্যালেঞ্জও নিয়ে আসে। এই পরিবেশে প্লেইন জাভাস্ক্রিপ্টের মতো ডায়নামিক ভাষাগুলির উপর নির্ভর করা কম্পাস ছাড়া ঝড় মোকাবেলা করার মতো – এটি কিছুক্ষণ কাজ করতে পারে, কিন্তু আপনি অপ্রত্যাশিত এবং বিপজ্জনক জায়গায় পড়ার ধারাবাহিক ঝুঁকিতে থাকেন।
টাইপস্ক্রিপ্ট, বিশেষ করে যখন জড-এর মতো একটি রানটাইম বৈধতা লাইব্রেরির সাথে যুক্ত হয়, তখন কম্পাস প্রদান করে। এটি আপনাকে এআই-এর বিশৃঙ্খল, নমনীয় বিশ্বের জন্য স্পষ্ট, কঠোর চুক্তি সংজ্ঞায়িত করতে দেয়। স্ট্যাটিক বিশ্লেষণ, অনুমানকৃত টাইপ এবং রানটাইম স্কিমা বৈধতা ব্যবহার করে, আপনি এমন অ্যাপ্লিকেশন তৈরি করতে পারেন যা কেবল আরও শক্তিশালী নয়, বরং উল্লেখযোগ্যভাবে আরও নির্ভরযোগ্য, রক্ষণাবেক্ষণযোগ্য এবং স্থিতিস্থাপক।
একটি এলএলএম-এর সম্ভাবনাময় আউটপুট এবং আপনার কোডের সুনির্দিষ্ট লজিকের মধ্যে সেতুটিকে অবশ্যই শক্তিশালী করতে হবে। টাইপ সেফটিই সেই দুর্গ। এই নীতিগুলি গ্রহণ করে, আপনি কেবল আরও ভালো কোড লিখছেন না; আপনি আপনার এআই-চালিত সিস্টেমগুলির মূল অংশে বিশ্বাস এবং পূর্বাভাসযোগ্যতা ইঞ্জিনিয়ারিং করছেন, যা আপনাকে গতি এবং আত্মবিশ্বাসের সাথে উদ্ভাবন করতে সক্ষম করবে।